package com.automannn.codeGenerator.core.parser.node.leaf;


import java.io.IOException;
import java.io.Writer;

import com.automannn.codeGenerator.core.context.InternalContextAdapter;
import com.automannn.codeGenerator.core.exception.TemplateInitException;
import com.automannn.codeGenerator.core.parser.Parser;
import com.automannn.codeGenerator.core.parser.Token;
import com.automannn.codeGenerator.core.parser.node.ParserVisitor;
import com.automannn.codeGenerator.core.parser.node.SimpleNode;


/**
 * This node holds the "Textblock" data which should not be interpreted by Velocity.
 *
 * Textblocks are marked in Velocity with #[[content here]]# notation. Velocity
 * will output everything between the markers and does not attempt to parse it in any way.
 */
public class ASTTextBlock extends SimpleNode
{
    public static final String START = "#[[";
    public static final String END = "]]#";
    private char[] ctext;

    /**
     * @param id
     */
    public ASTTextBlock(int id)
    {
        super(id);
    }

    /**
     * @param p
     * @param id
     */
    public ASTTextBlock(Parser p, int id)
    {
        super(p, id);
    }

    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object)
     */
    public Object jjtAccept(ParserVisitor visitor, Object data)
    {
        return visitor.visit(this, data);
    }

    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)
     */
    public Object init(InternalContextAdapter context, Object data)
            throws TemplateInitException
    {
        Token t = getFirstToken();

        String text = t.image;

        // t.image is in format: #% <string> %#
        // we must strip away the hash tags
        text = text.substring(START.length(), text.length() - END.length());

        ctext = text.toCharArray();
        return data;
    }

    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)
     */
    public boolean render( InternalContextAdapter context, Writer writer)
            throws IOException
    {
        writer.write(ctext);
        return true;
    }
}

